package main

import (
	"fmt"
	"math/rand"
	"time"
)

// 交换数据
func swip(a, b *int) {
	fmt.Println("a=", *a, "b=", *b)
	*a, *b = *b, *a
}

// 数组作为参数传递
func modify(a *[4]int) {
	(*a)[0] = 22
	fmt.Printf("a =%d\n", *a)
}
func main() {
	a := 10
	fmt.Println("a = ", a)
	fmt.Println("&a =", &a)
	var b *int
	b = &a
	*b = 666
	fmt.Println("b=", b, "a =", a)
	c := new(int)
	c = &a
	*c = 888
	fmt.Println("c=", c, "a=", a)
	d := new(int)
	*d = a
	fmt.Println("d=", d)
	//  指针交换两个变量
	var x1, y1 *int
	x, y := 1, 10
	x1 = &x
	y1 = &y
	swip(x1, y1)
	fmt.Println("x = ", x, "y=", y)
	// 全部初始化
	var e [5]int = [5]int{1, 2, 3, 4, 5}
	fmt.Println(e)
	//部分初始化，没有初始化的元素自动赋值为0
	r := [5]int{2: 2, 4: 4}
	fmt.Println(r)
	var w [3][4]int = [3][4]int{2: {1, 2, 3, 5}}
	fmt.Println(w)
	//同类型的数组可以赋值
	g := [3]int{1, 3, 4}
	var h [3]int
	h = g
	fmt.Println(h)
	//随机数的使用
	rand.Seed(time.Now().UnixNano()) //以当前事件作为种子
	for i := 0; i < 5; i++ {
		//fmt.Println("value=",rand.Int())
		//fmt.Println("value=",rand.Int63n(100))
	}
	// 数组作为函数的参数
	j := [4]int{1, 4}
	modify(&j)
	fmt.Println("j=", j)
	//切片
	array1 := [5]int{3, 4, 5, 6, 7}
	slice1 := array1[0:4:5]
	fmt.Println("slice1=", slice1, len(slice1), cap(slice1))
	slice1 = slice1[1:3:3]
	fmt.Println("slice1=", slice1, cap(slice1))
	//切片的copy
	slice2 := []int{1, 2, 3, 4, 5}
	copy(slice2, slice1)
	fmt.Println("slice2=", slice2)
}
